; =================================
; ========== ALIOHJELMAT ==========
; =================================

; ========== SEKALAISIA ==========

WriteLine:
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	sta $2007
	rts

ReadJoypad:
	; Palauttaa painetut nppimet Keystate-muuttujassa.
	; Bitit 7-0: A B sel sta yl ala vas oik
	
	ldy #08
	ldx #01
	stx $4016
	dex
	stx $4016
ReadJoyLoop:	
	lda $4016
	ror a
	txa
	rol a
	tax
	dey
	bne ReadJoyLoop
	sta Keystate
	rts

Viive:
	; uloin: Temp, keski: X-rek., sisin: Y-rek.
	lda #03
	sta Temp
ViiveTEMPSilm:
	ldx #$80
ViiveXSilm:
	ldy #$FF
ViiveYSilm:
	dey
	bne ViiveYSilm
	dex
	bne ViiveXSilm
	dec Temp
	bne ViiveTEMPSilm
	rts

TyhjennaSpriteMuisti:
	ldx #00	; tyhjenn spriteille varattu RAM-alue ($0300-$03FF)
	lda #00
SprClrLoop:
	sta $0300,x
	inx
	cpx #00
	bne SprClrLoop
	rts

PaivitaAsevoimaNaytto:
	lda AseenTeho
	clc
	adc #$1A		; Asevoimasymbolit: $1B, $1C, $1D, $1E.
	ldx #01
	sta Sprite_asevoima,x
	rts

SammutaPPU:
	lda #00
	sta $2000
	sta $2001
	rts

ValmistelePaletinKirjoitus:
	; VRAM $3F00 - $3F1F.
	lda #$3F
	sta $2006
	lda #00
	sta $2006
	rts

ValmisteleNameTablenKirjoitus:
	; VRAM $2000 - $23BF; sen jlkeinen Attribute Table saatetaan mys kirjoittaa.
	lda #$20
	sta $2006
	lda #00
	sta $2006
	rts

SiirraSpritedata:
	; Kopioi RAM-alue $0300 - $03FF SPR-RAM:iin. $4014 on sprite-DMA-rekisteri.
	ldx #03
	stx $4014
	rts




; ========== OMAN KONEEN LIIKUTUS ==========

MoveLeft:
	; Oman koneen liikutus vasemmalle.
	ldx #03
	lda Sprite_omakone2,x
	cmp #00
	beq EiEnaaVasemmalle
	dec Sprite_omakone1,x
	dec Sprite_omakone2,x
	dec Sprite_omakone3,x
	dec Sprite_omakone4,x
	dec Sprite_omakone5,x
	dec Sprite_omakone6,x
	dec Sprite_omakone7,x
	dec Sprite_liekki,x
EiEnaaVasemmalle:
	rts

MoveRight:
	; Oman koneen liikutus oikealle.
	ldx #03
	lda Sprite_omakone4,x
	cmp #$F8
	beq EiEnaaOikealle
	inc Sprite_omakone1,x
	inc Sprite_omakone2,x
	inc Sprite_omakone3,x
	inc Sprite_omakone4,x
	inc Sprite_omakone5,x
	inc Sprite_omakone6,x
	inc Sprite_omakone7,x
	inc Sprite_liekki,x
EiEnaaOikealle:
	rts

MoveUp:
	; Oman koneen liikutus yls.
	lda Sprite_omakone2
	cmp #$10
	beq EiEnaaYlos
	dec Sprite_omakone1
	dec Sprite_omakone2
	dec Sprite_omakone3
	dec Sprite_omakone4
	dec Sprite_omakone5
	dec Sprite_omakone6
	dec Sprite_omakone7
	dec Sprite_liekki
EiEnaaYlos:
	rts

MoveDown:
	; Oman koneen liikutus alas.
	lda Sprite_omakone2
	cmp #$D7
	beq EiEnaaAlas
	inc Sprite_omakone1
	inc Sprite_omakone2
	inc Sprite_omakone3
	inc Sprite_omakone4
	inc Sprite_omakone5
	inc Sprite_omakone6
	inc Sprite_omakone7
	inc Sprite_liekki
EiEnaaAlas:
	rts

NaytaAsevoimaBonus:
	lda #01
	sta BonusIlmassa
	lda VihY2,y			; Tuhotun vihollisen alareunan Y-koordinaatti...
	sta Sprite_bonus		; ...bonuksen Y-koordinaatiksi.
	ldx #01
	lda #$1F
	sta Sprite_bonus,x	; Tiilen numero (spriten perusosoite + 1).
	ldx #02	
	lda #%00100010		; Attribuutit: ei peilausta, paletti 3/4.
	sta Sprite_bonus,x
	ldx #03
	lda VihX1,y			; Tuhotun vihollisen vasemman reunan X-koordinaatti...
	clc
	adc #18
	sta BonusX
	sta Sprite_bonus,x	; ...bonuksen X-koordinaatiksi.
	rts

PoistaAsevoimaBonus:
	lda #00
	sta BonusIlmassa
	ldx #01			; Tiilen numeroksi #00.
	lda #00
	sta Sprite_bonus,x
	rts

; ========== VIHOLLISEN POISTO ==========
PoistaVihollinen:		; Y:ss on poistettavan vihollisen numero.
; X = Y * 4.
	tya
	asl a
	asl a
	tax

	inx			; vihollisen tiilen (perusosoite + 1) numeroksi 00
	lda #00
	sta Sprite_vihkone1,x
	sta Sprite_vihkone2,x
	sta Sprite_vihkone3,x
	sta Sprite_vihkone4,x

	lda #00		; Viholliseen osuneet luodit 0:aan.
	sta VihDmg,y

	lda #00		; Vihollispaikka vapaaksi.
	sta VihIlmassa,y
	sta VihXSuunta,y

	rts

; ========== VIHOLLISEN LISYS ==========
LisaaVihollinen:
; Kokeile, onko mikn 6:sta VihIlmassa-osoitteesta vapaana (00).
; Jos on, merkitse se varatuksi (01) ja siirry kohtaan VihollispaikkaLoydetty.

; A-rekisteriss on nyt vihollisen toivottu X-sijainti. Kuitenkin 1. bitti kertoo, liikkuuko vihollinen X-suunnassa.
	sta Temp2

	ldy #00
VihpaikanHakuLoop:
	lda VihIlmassa,y
	cmp #00				; Onko vapaa?
	beq VihpaikkaLoydetty
	iny
	cpy #06
	bne VihpaikanHakuLoop
	.db 02				; Peli tilttaa, koska normaalisti 6 vihollispaikan pitisi aina riitt.

VihpaikkaLoydetty:
; Y-rekisteriss on vihollispaikan numero (0 - 5).
	sty Temp
; Merkitse vihollispaikka varatuksi.
	lda #01
	ldx Temp
	sta VihIlmassa,x

; Mrit vihollisen vaakasuuntaisen liikkeen suunta.
	lda Temp2
	and #%00000001
	cmp #00
	beq EiVaakaliiketta
		lda Temp2
		and #%10000000
		cmp #00
		beq OnVasemmallaPuolella
			; Vihollinen aloittaa oikealta, joten liikkuu vasemmalle.
			lda #01
			sta VihXSuunta,x
			jmp EiVaakaliiketta
		OnVasemmallaPuolella:
			; Vihollinen aloittaa vasemmalta, joten liikkuu oikealle.
			lda #02
			sta VihXSuunta,x

EiVaakaliiketta:
; X = Temp * 4.
	lda Temp
	asl a
	asl a
	tax
; Y-koordinaatti kohdalleen (spriten perusosoite).
	lda #00
	sta Sprite_vihkone1,x
	sta Sprite_vihkone2,x
	clc
	adc #08
	sta Sprite_vihkone3,x
	sta Sprite_vihkone4,x
; Tiilten numerot kohdalleen (spriten perusosoite + 1).
	inx
	lda #$31
	sta Sprite_vihkone1,x
	sta Sprite_vihkone2,x
	lda #$32
	sta Sprite_vihkone3,x
	sta Sprite_vihkone4,x
; Attribuutit kohdalleen (spriten perusosoite + 2).
	inx
	lda #%00100001
	sta Sprite_vihkone1,x
	sta Sprite_vihkone3,x
	lda #%01100001
	sta Sprite_vihkone2,x
	sta Sprite_vihkone4,x
; X-koordinaatti kohdalleen (spriten perusosoite + 3).
	inx
	lda Temp2		; X-koordinaatti, joka vihollisella pit olla.
	and #%11111110	; Alin bitti kertoi, liikkuuko vihollinen sivusuunnassa.
	sta Sprite_vihkone1,x
	sta Sprite_vihkone3,x
	clc
	adc #08
	sta Sprite_vihkone2,x
	sta Sprite_vihkone4,x

	jsr SiirraSpritedata

VihLisaysEiOnnistu:
	rts

; ========== AMPUMINEN ==========

Shoot:
; Kokeile, onko mikn 16:sta AmmustenTilat-osoitteesta vapaana (00).
; Jos on, merkitse se varatuksi (01) ja siirry kohtaan AmmuspaikkaLoydetty.
; X-rekisteriss on kytettvn ammuspaikan numero (0 - 15).

	ldx #00
AmmuspaikanHakuLoop:
	lda AmmustenTilat,x
	cmp #00				; Onko vapaa?
	beq AmmuspaikkaLoydetty
	inx
	cpx #16
	bne AmmuspaikanHakuLoop
	.db 02		; Paikat 0 - 15 on kokeiltu, mutta kaikki olivat varattuja. Peli tilttaa.

AmmuspaikkaLoydetty:
; X-rekisteriss on ammuspaikan numero (0 - 15).
	stx Temp
; Merkitse ammuspaikka varatuksi.
	lda #01
	sta AmmustenTilat,x

	lda #01		; niefekti 1: ammunta.
	jsr AaniEfekti

; X-rekisteriin nytlle tulostettavan spriten alkuosoite (Temp * 4).
	lda Temp
	asl a
	asl a
	tax

	lda Sprite_omakone1	; \ Y-koordinaatti (perusosoite).
	and #%11111110		; | Lhtpaikan pit olla parillinen, jotta
	sta AmmustenSpritet,x	; / trmystarkistus toimii.
	inx				; \
	lda #$30			; | Tavua edempn on tiilen numero ($30).
	sta AmmustenSpritet,x	; /
	inx				; \
	inx				; | 2 tavua edempn on X-koordinaatti
	lda AluksenXkoord		; | (spriten perusosoite + 3).
	sta AmmustenSpritet,x	; /

	jsr SiirraSpritedata
AmpuminenEiOnnistu:
	rts


; ========== GAME OVER ==========

; Oikeastaan tm ei ole aliohjelma, koska siit poistutaan
; JMP-kskyll pvalikkoon.
GameOver:
; NMI-rutiini pois plt.
	lda #$10
	sta $2000
	lda #$1E
	sta $2001
; "Game Over"-teksti (5 sprite)
	lda #115		; Y-koordinaatti (ainakin FCE Ultrassa tasan keskell)
	sta Sprite_gover1
	sta Sprite_gover2
	sta Sprite_gover3
	sta Sprite_gover4
	sta Sprite_gover5
	ldx #01		; tiilen numero (spriten perusosoite + 1)
	lda #$20
	sta Sprite_gover1,x
	lda #$21
	sta Sprite_gover2,x
	lda #$22
	sta Sprite_gover3,x
	lda #$23
	sta Sprite_gover4,x
	lda #$24
	sta Sprite_gover5,x
	ldx #02		; vri ja muuta tietoa (spriten perusosoite + 2)
	lda #01
	sta Sprite_gover1,x
	sta Sprite_gover2,x
	sta Sprite_gover3,x
	sta Sprite_gover4,x
	sta Sprite_gover5,x
	ldx #03		; x-koordinaatti (ainakin FCE Ultrassa tasan keskell)
	lda #$6C
	sta Sprite_gover1,x
	lda #$74
	sta Sprite_gover2,x
	lda #$7C
	sta Sprite_gover3,x
	lda #$84
	sta Sprite_gover4,x
	lda #$8C
	sta Sprite_gover5,x

	jsr SiirraSpritedata

GameOverLoop:
; Siirry start-napin painalluksesta Title Screeniin.
	jsr ReadJoypad
	lda Keystate
	and #%00010000
	beq StartiaEiPainettu
	jsr Viive			; \ Siirtyminen
	jmp TitleScreen		; /
StartiaEiPainettu:
	jmp GameOverLoop

; ========== NIEFEKTI ==========

AaniEfekti:		; A-rekisteriss vlittyy efektin numero.
	cmp #01
	bne KokeileSFX2
		; Efekti 1: ammunta.
	lda #%00111111
	sta $4000
	lda #%10000011
	sta $4001
	lda #%11111111
	sta $4002
	lda #%00000000
	sta $4003
	rts
KokeileSFX2:
	cmp #02
	bne KokeileSFX3
		; Efekti 2: ammuksen osuminen.
	lda #%00111111
	sta $4004
	lda #%10001001
	sta $4005
	lda #%11111111
	sta $4006
	lda #%00000000
	sta $4007
	rts
KokeileSFX3:
	cmp #03
	bne KokeileSFX4
		; Efekti 3: tuhoutuminen.
	lda #%00001111
	sta $400C
	lda #%00001011
	sta $400E
	lda #%10110000
	sta $400F
	rts
KokeileSFX4:
	cmp #04
	bne KokeileSFX5
		; Efekti 4: bonuksen kerys.
	lda #%00111111
	sta $4004
	lda #%11001010
	sta $4005
	lda #%11111111
	sta $4006
	lda #%00000000
	sta $4007
	rts
KokeileSFX5:
	cmp #05
	bne KokeileSFX6
		; Efekti 5: bonuksen kerys myhstyi.
	lda #%00111111
	sta $4004
	lda #%11100010
	sta $4005
	lda #%11111111
	sta $4006
	lda #%00000000
	sta $4007
	rts
KokeileSFX6:
		; Efekti 6 ei ole olemassa, joten peli tilttaa.
	.db 02